package com.company.collectionsFramework;


public class CollectionComputer {
    /**
     * List查找的低效率
     * 假设在List中存放着无重复的名称，没有顺序的的2000000个Hero，要把名字叫做"hero 100000"的对象找出来。
     * List的做法是对每一个进行挨个遍历，直到找到名字叫做'hero 1000000'的英雄，
     * 最差的情况下，需要遍历比较20000000次，才能找到对应的英雄。
     *
     * HashMap的性能表现
     * 使用hashMap做同样的查找:
     *  1、初始化20000000个对象到HashMap中。
     *  2、进行10次查询。
     *  3、统计每一次的查询消耗的时间。
     *
     *  HashMap的原理和字典
     *  在展开HashMap原理的讲解之前，首先回忆一下大家初中个高中使用的汉英字典。
     *  比如要找一个单词对应的中文意思，假设单词是Lengendary首先在目录找到Lengendary在第555页。、
     *  然后，翻到第555页，这页不只一个单词，但是量已经很少了，逐一比较，很快就定位目标单词Lengendary。
     *  555相当于就是Lengendary对应的hashcode；
     *
     * 分析HashMap性能卓越的原因
     * ---hashcode概念---
     * 所有的对象，都有一个对应的hashcode(散列值)
     *  比如字符串"green"对应的是1001(实际上不是，这里不方便理解，假设的值)
     *  比如字符串"temoo"对应的是1004
     *  比如字符串"db"对应的1008
     *  比如字符串"annie"对应的也是1008
     * ---保存数据---
     *  准备一个数组，其长度是2000，并且设定特殊的hashcode算法，使得所有字符串对应的hashcode，都会落在0-1999之间。
     *  要存放名字是"gareen"的英雄，就把该英雄和名称组成一个键值对，存放在数组的1001这个位置上
     *  要存放名字是"temoo"的英雄，就死该英雄存放在数组的1004这个位置上面
     *  要存放名字是"db"的英雄，就是把该英雄存放在数组的1008这个位置上
     *  要存放名字是"annie"的英雄，然而"annie"的hashcode 1008对应的位置已经有db英雄了。
 *  那么就在这里创建一个链表，接在db英雄后面存放annie
     *---查找数据---
     * 比如要查找gareen，首先计算"gareen"的hashcode是1001，根据1001这个下标，到数组中进行定位(根据数组下标进行定位，是非常快速的)
     *发现1001这个位置只有一个英雄，那么该英雄就是gareen;
     * 比如要查找annie，首先计算"annie"的hashcode是1008，根据1008的这个下标，到数组中进行定位，发现1008位置有两个英雄，
     * 那么就对两个英雄的名字进行逐一比较(equals)。因为此时需要比较的量就已经少很多了。很快也就可以找出目标英雄。
     * 这就是hashmap进行查询，非常快的原理。这是一种空间换时间的思维方式
     *
     * ---HashSet判断是否重复---
     * HashSet的数据是不能重复的，相同的数据不能保存在一起，到底如何判断是否重复的呢。
     *  根据HashSet和HashMap的关系，我们了解到因为HashSet没有自身的实现，而是里面封装了一个HashMap，
 *  所以本质上就是判断HashMap的key是否重复。
     *
     * **/
    public static void main(String[] args) {

    }
}
